#ifndef CMD_HEADER
#define CMD_HEADER
#include<string>
#include<fstream>
#include<sstream>
#include<iostream>
#include<algorithm>
#include<iterator>
#include<vector>
#include<map>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include "def.hpp"

using namespace std;

/* This class is a Singleton */
namespace Puza{
  class PuzaCMD{
  public:
    static PuzaCMD* Instance();
    void ParseCMD(int argc, char* argv[]);
  private:
    PuzaCMD();  // private so that it can  not be called                                                                                               
    PuzaCMD(PuzaCMD const&){}; // copy constructor is private
    ModelType CheckModelType(string temp_model_type);
    TaskType CheckTaskType(string temp_task_type);
    PointLossType CheckPointLossType(string temp_point_loss_type);
    RankLossType CheckRankLossType(string temp_rank_loss_type);
    InputFormat CheckInputFormat(string temp_input);
    static PuzaCMD* m_pInstance;
    ProcessType CheckProcessType(string temp_type);
  };
};

#endif
